GreengrassのLambdaでもPython3.7が利用可能に!!Greengrass Core 1.9.0がリリースされました
はじめに
サーバーレス開発部@大阪の岩田です。
GW真っ最中ですがGreengrass Core 1.9.0がリリースされたというニュースが飛び込んできました。 1.8.0がリリースされたのが3月上旬なので、約2ヶ月という短いスパンでのリリースとなります。
個人的な目玉機能として、Greengrass Core1.9.0からLambdaのランタイムとしてPython3.7が利用可能になったという変更があります。現在関わっている案件でGreengrassを活用したシステムを構築しているのですが、バックエンドの管理用APIはPython3系で、バックエンドと連携させるためのデバイス(Greengrass)側のLambdaはPython2系で実装を進めており、ロジックの共通化やPython2系のユニットテストに課題を抱えていました。このリリースを機に全部Python3.7に移行してコードを整理できそうです!
早速Greengrass Core1.9.0を試していきたいと思います。
Greengrass core 1.9.0の新機能
v1.9.0の主な修正点です
LambdaのランタイムにPython 3.7とNode.js 8.10のサポートを追加
個人的に一番嬉しい追加拡張です。 これまでGreengrass Lambdaで利用できるPythonとNode.jsのバージョンはそれぞれ
- Python 2.7
- Node.js 6.10
と古めのバージョンしかサポートされていませんでした。 利用できるライブラリのバージョン等で制約を受けることも多かったのですが、これで開発に自由度が出そうです。 なお、これまで通りPython 2.7、Node.js 6.10を利用することも可能です。
MQTTのコネクションを最適化 GG Core <-> AWS IoT Core間で確立するコネクション数を削減
Greengrass Core1.8ではGG Core <-> AWS IoT Core間で以下のMQTT接続を確立していました。
オペレーション種別 | クライアントID |
---|---|
デプロイメント | core-thing-name ※コアデバイスのモノの名前 例)MyCoreThing |
MQTTメッセージの交換 | core-thing-name-spr ※コアデバイスのモノの名前 + -spr 例)MyCoreThing-spr |
シャドウの同期 | core-thing-name-snn ※コアデバイスのモノの名前+ -s + 連番 例)MyCoreThing-s01 |
デバイス証明書管理 | core-thing-name-dcm ※コアデバイスのモノの名前 + -dcm 例)MyCoreThing-dcm |
Greengrass Core1.9からは以下のように変更されます。
オペレーション種別 | クライアントID |
---|---|
デプロイメント | core-thing-name ※コアデバイスのモノの名前 例)MyCoreThing |
MQTTメッセージの交換 | core-thing-name-cnn ※コアデバイスのモノの名前+ -c + 連番 例)MyCoreThing-c01 |
この変更によりMQTTのコネクション数に基づく課金を低く抑えることが可能になります。
コアデバイス <-> IoTデバイス間の接続で楕円曲線暗号化をサポート
Greengrass CoreのローカルMQTTサーバー機能を利用すると、エッジ側のローカルネットワーク内でコアデバイス <-> IoTデバイス間でTLSの接続を確立し、MQTTのメッセージ交換が可能になります。
この通信用のTLS接続を確立する際に、デフォルトでは、Greengrassが自動的に生成したRSA秘密鍵が利用されますが、Greengrass Core 1.9からはconfig.json
のMQTTServerCertificate
に秘密鍵のパスを指定することで楕円曲線暗号を使用した秘密鍵が利用可能になりました。秘密鍵のフォーマットには
- SECG1
- PKCS#8
がサポートされています。また、この変更に伴ってローカルネットワーク内の暗号化スイートに以下の2種が選択できるようになりました。
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
やってみる
ここからは実際にGreengrass Core 1.9.0を使ってPython3.7のLambdaをデプロイしてみます。
Python3.7とGreengrass SDKの導入
まずコアデバイスにPython3.7をインストールします。詳細な手順は割愛させて頂きます。
次にGreengrass SDK For Pythonをインストールします。Greengrass Core 1.9.0のリリースに合わせてPython3.7に対応したVersion1.4.0が先日リリースされています。
$ pip3.7 install greengrasssdk Collecting greengrasssdk Downloading https://files.pythonhosted.org/packages/58/7f/7c48616e8632bc5d44b58d04087ee85bad4ee8db3a2d2cca5ef26434b5e4/greengrasssdk-1.4.0-py2.py3-none-any.whl Installing collected packages: greengrasssdk Successfully installed greengrasssdk-1.4.0
Lambda関数の作成
次にGreengrassにデプロイするPython3.7のLambda関数を作成します。
今回は「設計図の使用」からGreengrass向けのサンプルを選択します
関数名は「GGHelloPython37」としました。
ランタイムにPython3.7を指定しつつ、最新版のGreengrass Greengrass SDKを利用するためにLambdaのパッケージに含まれるSDKを削除します。
ここまでできたらLambda関数を保存してバージョンを発行しておきます。
デプロイ
Greengrass GroupにLambda関数を追加してデプロイしていきます。 Lambdaの追加画面にいくと、以前とは違いPython3.7で作成したLambdaが選択可能になっていることが分かります。
Lambda関数を追加したらLong-Lived Lambdaとして設定して、MQTTのトピックhello/world
へのサブスクリプションを追加しておきます。
テスト
Greengrass Groupのデプロイを行った後、マネジメントコンソールからMQTTのトピックhello/world
をサブスクライブすると
データが流れてきました!テスト成功です。
まとめ
Greengrass v1.9.0の新機能についてご紹介しました。 LambdaのPython 3.7対応により、Greengrassでより多くのユースケースが実現出来そうです。すでにGreengrassを利用されている方もこの機会にバージョンアップを検討してみてはいかがでしょうか?